import uni from '@dcloudio/vite-plugin-uni'
import { resolve } from 'path'
import type { UserConfig } from 'vite'
import { defineConfig } from 'vite'
import viteCompression from 'vite-plugin-compression'
import VueDevTools from 'vite-plugin-vue-devtools'

/**
 * Vite 配置
 * @see https://vitejs.dev/config/
 */
export default defineConfig(async (): Promise<UserConfig> => {
  /**
   * 获取当前运行的平台
   */
  const platform = process.env.UNI_PLATFORM

  const isDev = process.env.NODE_ENV === 'development'

  /**
   * 为兼容 @dcloudio/vite-plugin-uni 采用 CJS ，而 UnoCSS 只支持 ESM
   * @see https://github.com/dcloudio/uni-app/issues/4815
   */
  const UnoCSS = await import('unocss/vite').then(i => i.default)

  return {
    // 确保加载 .env.*.local 文件
    envPrefix: ['VITE_', 'UNI_'],

    plugins: [
      uni(),
      UnoCSS(),
      /**
       * gzip 压缩插件配置（仅在 H5 平台启用）
       * @see https://www.viterc.cn/en/vite-plugin-compression.html
       */
      platform === 'h5' &&
        viteCompression({
          verbose: true, // 是否在控制台输出压缩结果
          threshold: 10240, // 体积大于 threshold 才会被压缩，单位 b，默认 10240 (10KB)
        }),
      /**
       * Vue 开发工具插件配置
       * @note 仅在 H5 开发环境启用
       * @see https://github.com/vuejs/devtools
       */
      platform === 'h5' && isDev && VueDevTools(),
    ],
    resolve: {
      // 路径别名配置
      alias: {
        '@': resolve(__dirname, 'src'),
        '@styles': resolve(__dirname, 'src/styles'),
      },
    },
    build: {
      // 开发阶段启用源码映射
      sourcemap: isDev,
      // 打包配置
      rollupOptions: {
        output:
          platform === 'h5'
            ? {
                // JS 文件打包位置
                chunkFileNames: 'static/js/[name]-[hash].js',
                entryFileNames: 'static/js/[name]-[hash].js',
                // 其他资源保持原有目录结构
                assetFileNames: 'static/[ext]/[name]-[hash].[ext]',
                // 代码分割配置
                manualChunks: {
                  'vue-vendor': ['vue', 'vue-i18n'],
                  'uni-vendor': ['@dcloudio/uni-app'],
                  'ui-vendor': ['wot-design-uni'],
                  'lodash-es': ['lodash-es'],
                  pinia: ['pinia', 'pinia-plugin-persistedstate'],
                },
              }
            : undefined,
      },
      // 使用 terser 压缩器，增强压缩效果。as const 用于类型收窄
      minify: 'terser' as const,
      terserOptions: {
        compress: {
          // 生产环境移除 console
          drop_console: !isDev,
          // 生产环境移除 debugger
          drop_debugger: !isDev,
        },
      },
    },
    css: {
      // CSS 预处理器配置
      preprocessorOptions: {
        scss: {
          additionalData: '@use "@styles/abstracts" as *;',
        },
      },
    },
    // 开发服务器配置
    server: {
      // 启用热更新
      hmr: true,
      // 服务端口
      port: 8080,
      // 是否自动打开浏览器
      open: true,
      // 热更新配置
    },
  }
})
